home *** CD-ROM | disk | FTP | other *** search
Oberon Document | 1996-01-05 | 6.6 KB | 211 lines | [oODC/obnF] |
- Documents.StdDocumentDesc
- Documents.DocumentDesc
- Containers.ViewDesc
- Views.ViewDesc
- Stores.StoreDesc
- Documents.ModelDesc
- Containers.ModelDesc
- Models.ModelDesc
- Stores.ElemDesc
- TextViews.StdViewDesc
- TextViews.ViewDesc
- TextModels.StdModelDesc
- TextModels.ModelDesc
- TextModels.AttributesDesc
- Helvetica
- Helvetica
- Helvetica
- MODULE ObxGraphs;
- IMPORT
- Domains, Stores, Ports, Models, Views, Controllers, Properties, TextModels, TextViews, TextMappers;
- CONST minVersion = 0; maxVersion = 0;
- TYPE
- Value = POINTER TO RECORD
- next: Value;
- val: LONGINT
- END;
- Model = POINTER TO RECORD (Models.ModelDesc)
- values: Value
- END;
- View = POINTER TO RECORD (Views.ViewDesc)
- model: Model
- END;
- ModelOp = POINTER TO RECORD (Domains.OperationDesc)
- model: Model;
- values: Value
- END;
- PROCEDURE (op: ModelOp) Do;
- VAR v: Value; msg: Models.UpdateMsg;
- BEGIN
- v := op.model.values; op.model.values := op.values; op.values := v; (* swap *)
- Models.Broadcast(op.model, msg)
- END Do;
- PROCEDURE (m: Model) Internalize (VAR rd: Stores.Reader);
- VAR thisVersion: SHORTINT; n: INTEGER; v, last: Value;
- BEGIN
- m.Internalize^(rd);
- IF ~rd.cancelled THEN
- rd.ReadVersion(minVersion, maxVersion, thisVersion);
- IF ~rd.cancelled THEN
- last := NIL;
- rd.ReadInt(n); (* read number of values *)
- WHILE n # 0 DO
- NEW(v); rd.ReadLInt(v.val);
- IF last = NIL THEN m.values := v ELSE last.next := v END; (* append value *)
- last := v;
- DEC(n)
- END
- END
- END
- END Internalize;
- PROCEDURE (m: Model) Externalize (VAR wr: Stores.Writer);
- VAR v: Value; n: INTEGER;
- BEGIN
- m.Externalize^(wr);
- wr.WriteVersion(maxVersion);
- v := m.values; n := 0; WHILE v # NIL DO INC(n); v := v.next END;
- wr.WriteInt(n); (* write number of values *)
- v := m.values; WHILE v # NIL DO wr.WriteLInt(v.val); v := v.next END
- END Externalize;
- PROCEDURE (m: Model) CopyAllFrom (source: Models.Model);
- BEGIN
- m.values := source(Model).values (* values are immutable and thus can be shared *)
- END CopyAllFrom;
- PROCEDURE (m: Model) InitFrom (source: Models.Model); (* do nothing *)
- END InitFrom;
- PROCEDURE (m: Model) SetValues (v: Value);
- VAR op: ModelOp;
- BEGIN
- NEW(op); op.model := m; op.values := v;
- Models.Do(m, "Set Values", op)
- END SetValues;
- PROCEDURE OpenData (v: View);
- VAR t: TextModels.Model; f: TextMappers.Formatter; h: Value;
- BEGIN
- t := TextModels.dir.New();
- f.ConnectTo(t);
- h := v.model.values;
- WHILE h # NIL DO
- f.WriteInt(h.val); f.WriteLn;
- h := h.next
- END;
- Views.OpenAux(TextViews.dir.New(t), "Values")
- END OpenData;
- PROCEDURE DropData (t: TextModels.Model; v: View);
- VAR s: TextMappers.Scanner; first, last, h: Value;
- BEGIN
- s.ConnectTo(t);
- s.Scan;
- WHILE s.type = TextMappers.int DO
- NEW(h); h.val := s.int;
- IF last = NIL THEN first := h ELSE last.next := h END;
- last := h;
- s.Scan
- END;
- v.model.SetValues(first)
- END DropData;
- PROCEDURE (v: View) Internalize (VAR rd: Stores.Reader);
- VAR thisVersion: SHORTINT; s: Stores.Store;
- BEGIN
- v.Internalize^(rd);
- IF ~rd.cancelled THEN
- rd.ReadVersion(minVersion, maxVersion, thisVersion);
- IF ~rd.cancelled THEN
- rd.ReadStore(s); ASSERT(s # NIL, 100);
- IF s IS Model THEN
- v.InitModel(s(Model))
- ELSE
- rd.TurnIntoAlien(Stores.alienComponent)
- END
- END
- END
- END Internalize;
- PROCEDURE (v: View) Externalize (VAR wr: Stores.Writer);
- BEGIN
- v.Externalize^(wr);
- wr.WriteVersion(maxVersion);
- wr.WriteStore(v.model)
- END Externalize;
- PROCEDURE (v: View) InitModel (m: Models.Model);
- BEGIN
- v.model := m(Model)
- END InitModel;
- PROCEDURE (v: View) ThisModel (): Models.Model;
- BEGIN
- RETURN v.model
- END ThisModel;
- PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: LONGINT);
- VAR h: Value; n: INTEGER; width, height, d, x: LONGINT;
- BEGIN
- h := v.model.values; n := 0; WHILE h # NIL DO INC(n); h := h.next END; (* count values *)
- IF n > 0 THEN
- v.context.GetSize(width, height);
- d := width DIV n; x := 0;
- h := v.model.values;
- WHILE h # NIL DO
- f.DrawRect(x, height - h.val * Ports.mm, x + d, height, Ports.fill, Ports.grey25);
- h := h.next; INC(x, d)
- END
- END
- END Restore;
- PROCEDURE (v: View) HandleModelMsg (VAR msg: Models.Message);
- BEGIN
- WITH msg: Models.UpdateMsg DO
- Views.Update(v, Views.keepFrames)
- ELSE
- END
- END HandleModelMsg;
- PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame; VAR msg: Views.CtrlMessage;
- VAR focus: Views.View);
- VAR x, y, w, h: LONGINT; modifiers: SET; isDown: BOOLEAN;
- BEGIN
- WITH msg: Controllers.TrackMsg DO
- REPEAT f.Input(x, y, modifiers, isDown) UNTIL ~isDown;
- v.context.GetSize(w, h);
- IF (x >= 0) & (y >= 0) & (x < w) & (y < h) THEN OpenData(v) END
- | msg: Controllers.PollDropMsg DO
- IF msg.view IS TextViews.View THEN msg.dest := f (* enable drop target feedback *) END
- | msg: Controllers.DropMsg DO
- IF msg.view IS TextViews.View THEN
- DropData(msg.view(TextViews.View).ThisModel(), v) (* interpret dropped text *)
- END
- ELSE
- END
- END HandleCtrlMsg;
- PROCEDURE (v: View) HandlePropMsg (VAR p: Properties.Message);
- CONST min = 10 * Ports.mm; max = 160 * Ports.mm; pref = 90 * Ports.mm;
- BEGIN
- WITH p: Properties.SizePref DO (* prevent illegal sizes *)
- IF p.w = Views.undefined THEN p.w := pref
- ELSIF p.w < min THEN p.w := min
- ELSIF p.w > max THEN p.w := max
- END;
- IF p.h = Views.undefined THEN p.h := pref
- ELSIF p.h < min THEN p.h := min
- ELSIF p.h > max THEN p.h := max
- END
- | p: Properties.FocusPref DO
- p.atLocation := FALSE; p.hotFocus := TRUE; p.setFocus := FALSE; p.selectOnFocus := FALSE
- ELSE
- END
- END HandlePropMsg;
- PROCEDURE Deposit*;
- VAR m: Model; v: View;
- BEGIN
- NEW(m);
- NEW(v); v.InitModel(m);
- Views.Deposit(v)
- END Deposit;
- END ObxGraphs.
- TextControllers.StdCtrlDesc
- TextControllers.ControllerDesc
- Containers.ControllerDesc
- Controllers.ControllerDesc
- TextRulers.StdRulerDesc
- TextRulers.RulerDesc
- TextRulers.StdStyleDesc
- TextRulers.StyleDesc
- TextRulers.AttributesDesc
- Helvetica
- Documents.ControllerDesc
-